/*
 * Created by 2006-6-28 下午10:45:44
 * $Id: HsqlServlet.java 76 2006-07-06 17:03:18Z wjx $
 */
package com.someok.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.hsqldb.Server;

import com.someok.base.Config;

/**
 * HSQL数据库的启动和关闭，通过servlet控制，主要实现init和destroy方法，应用启动时启动数据库，应用停止时关闭数据库.
 * 只所以不采用listener，是因为需要用listener初始化log4j先
 * 
 * <p>
 * <a href="HsqlServlet.java.html"><i>View Source</i></a>
 * </p>
 * 
 * @author wjx
 * @version $Revision: 76 $ $Date: 2006-07-07 01:03:18 +0800 (星期五, 07 七月 2006) $
 */
public class HsqlServlet extends BaseServlet {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(HsqlServlet.class);

	Server hsqlServer = new Server();

	Config propConfig = Config.getInstance();
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see com.someok.web.servlet.BaseServlet#outputPageBody(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	protected String outputPageBody(HttpServletRequest request,
			HttpServletResponse response) {
		return null;
	}

	public void init() throws ServletException {
		logInfo("初始化 HSQL 数据库......");
        // 数据库路径
        String databasePath = propConfig.getString("hsqldb.server.database");
        // 数据库别名
        String databaseName = propConfig.getString("hsqldb.server.dbName");
        // 是否在控制台输出信息
        String silentString = propConfig.getString("hsqldb.server.isSilent");
        // 是否控制isSilent所无法屏蔽的语句
        String silentOther = propConfig.getString("hsqldb.server.silentOther");

        if (databasePath == null) {
        	throw new RuntimeException("数据库路径为空，无法定位数据库位置！");
        } else {
        	// 数据库路径不为空则需替换${ctxPath}为应用的实际路径
        	// 如果没有找到${ctxPath}，则保持原状
        	if (databasePath.indexOf("${ctxPath}") != -1) {
				databasePath = StringUtils.replace(databasePath, "${ctxPath}", getWebAppBasePath());
			}
        }

        if (databaseName == null) {
        	throw new RuntimeException("数据库名字为空");
        }

        boolean isSilent = true;
        if (!"true".equalsIgnoreCase(silentString)) {
            isSilent = false;
        }
        
        
        // 必须放在前面设置，否则下面的两个set方法中会有些语句输出
        hsqlServer.setSilent(isSilent);
        // setSilent设置为true之后，仍然会有些语句输出到控制台上（用的PrintWriter）。
        // 下面的语句可以屏蔽这些输出
        if ("true".equalsIgnoreCase(silentOther)) {
            hsqlServer.setLogWriter(null);    
        }
        
        hsqlServer.setDatabasePath(0, databasePath);
        hsqlServer.setDatabaseName(0, databaseName);
        
        hsqlServer.start();
        logInfo("HSQL 数据库启动成功！");
        logInfo("--------------------------------------------------------------");

	}

	public void destroy() {
		System.out.println("准备关闭HSQL数据库...");
        int hStop = hsqlServer.stop();
        System.out.println("HSQL数据库关闭成功[" + hStop + "]...");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
	}
	
	private void logInfo(String string) {
		logger.info(string);
	}
}
